// 说一下 js 中类型转化的规则
// if() {} true / false  为 false 的值 false undefined null '' 0 NaN
// ! 可以把 这个值 转化成 boolean 类型
// console.log(!'')
// 运算 +(字符串拼接的含义) - * /   1/true
// console.log(1/'a')  NaN
// 运算 字符串拼接 (如果有一方是字符串就会转化成字符串)
// 1. 数字和非字符串相加    Null 相加 0  undefined 和 数字相加

console.log(1 + true) // 1 + 1
console.log(1 + null) // 1 + 0
console.log(1 + undefined) // NaN
console.log(1 + {}) // 1[object Object]

// 2. 非数字相加
console.log(true + true) // 1 + 1
console.log(true + {})   // true[object Object]

// 对象中有两个方法 valueOf toString
let obj = {
    [Symbol.toPrimitive]() {
        return 500
    },
    valueOf() {
        return 100
        // return {} // 原始数据类型
    },
    toString() {
        return 200 // 原始数据类型
        // return {}  // valueOf 和 toString 都不是原始数据类型 就会报错
    }
}

console.log(true + obj) 
// console.log({}.valueOf()) // {} valueOf 方法返回的 不是字符串的 时候再调 toString

// + - 这个符号 和 ! 很像
// console.log(typeof +'111') 
console.log(1 + + '123') 

console.log([] + {} == {} + []) // true
console.log([] + {}) // [object Object]
// [] {} 都不是普通值
// 1. 顺序执行 先调用 [].valueOf -> Array
// 2. 不是普通值, 继续调用 [].toString -> ''
// 3. 接下来 '' + {}
// 4. 调用 {}.toString -> [object Object]
console.log({} + []) // 0
// 
console.log([] + {}) // [Object Object]
console.log({} + [] == [] + {}) // true
// console.log('[object Object]' == 0)